iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 29
1
Google Developers Machine Learning

AI可以分析股票嗎?系列 第 29

偏門RL實測 :: 調出一個合適的環境參數 !!

  • 分享至 

  • xImage
  •  

零、引言

今天對我來說就是最後一天了,明天我希望能夠做一個總整理 (~發懶。今天的實測依然在極短期的股票策略預測,並延用前一篇「偏門RL實測 :: 用超簡單股票交易模擬器來訓練模型」的奇葩式訓練法,加以訓練和改善。

好孩子千萬不能學喔 ~

今天最主要想要實測怎麼樣可以調好一個RL環境的超參數,並最大化地提供最合適的Reward。 我會比較用手動調整以及透過簡單演算自動調整,看看哪個可以調的好 (然後沒有然後了...Orz

一、目前效果的極限

1. 模型狀態未知

其實RL裡面有兩種策略,一種是「對環境不了解(Model-Free)」,另一種是「對環境有了解(Model-Based)」,但無論哪種, 訓練後都能夠對環境有所了解 。但我目前的訓練方式完全沒有使用到環境優勢,原因在於我並沒有把環境的狀態(state)輸入給模型中進行訓練,模型不知道我現在有多少錢、買進時的價格或甚至賣出時的價格,所以更無法精確地知道我做了這個action後所大約能得到的reward

2. 時間不連續

因為取樣關係,我只會看前n刻的資料,所以在沒有「狀態」的前提下,模型無法得知「是否要到了收盤的時間點」,所以訓練出來的模型並不會因為要收盤而賣出股票。 這也是我到目前還沒有合併好幾天的資料一起train的原因XD

  • 綜上所述,其實已經可以預期模型訓練出來並不會太好

那幹啥做呢?

跟前幾篇比較呀! 如果用這個方法可行的話,在正規化相同的情況下,即可證明這樣的方式更勝過我們定義好答案的學習模式XDD

二、環境中的超參數

我們必須要定義我們環境中的超參數。先說說我們對訓練結果的三大訴求 :

    1. 不要隨便就買進或賣出 (希望買在最低賣在最高)
    1. 不要都不做事 (希望不要都選do_nothing或是都買都賣)
    1. 不要都不選不做事 (希望會觀察,並適時地選擇do_nothing)

而在我設計的環境中,有兩個影響loss且對立的計算

    1. 買賣數量比
    • 為了控制選擇動作的次數,我希望透過「選擇了幾次動作」的比來增加loss
    • EX : 希望每100次的行動應該要有95次do_nothing和2.5次買、2.5次賣出現
    1. 總資產
    • 因為希望總資產要提升,反過來說就是不希望虧本。 所以要特別設計當賠錢時必須有loss

這部份實在是要細說很難... 而且我寫得真的很亂,如果不介意就去看程式碼吧XD

所以超參數是...

超參數就是「買賣數量比」和「總資產」,的權重,如果讓「總資產」主導,容易會造成模型預測「不動作」。如果讓「買賣數量比」主導,模型並不一定會往「賺錢」的方向走,這兩個都是必須的。

三、手動調整 vs 自動調整

這邊先給一個前提,我都先將「賠錢」時的loss權重定為0.0001,所以我只要調整「買賣數量比」的權重即可。

  • 手動調整
    • 簡單來說就是瘋狂地測試,當遇到「都不動作」我應該要調高呢?還是調低? 之類的,說實在,測到後面我全亂掉了,還越調越慘Orz 此時與其相信自己,我寧可放棄尊嚴 (握拳!
  • 自動調整
    • 我用了一個很簡單的演算法,給個區間(max, min),在訓練過程中不斷迭代,max和min,最後會收斂到一個數字,那就是我們要的。
    • 實際測試後發現其實連這個區間都有local minimum Orz,直接奔潰啊!! 還是跟著我希望的「買賣數量比」有關的Orz

最主要是因為在沒有model state的情況下,我們仍然希望環境能夠學習do_nothing是很困難的,我們很容易不小心往「學得太難賣」或是「學得一直賣」的方向走,不管了,總之先上結果吧!

四、結果

比較於「比較不簡略的單股買賣模擬器 :: 面對現實吧 !」中的方法一與方法二

- 沒加入手續費 加入手續費
方法一
方法二
今天實作01 https://ithelp.ithome.com.tw/upload/images/20190930/20120140rJQkR2LzPF.png https://ithelp.ithome.com.tw/upload/images/20190930/20120140pB9Ugvq9WW.png
今天實作02 https://ithelp.ithome.com.tw/upload/images/20190930/20120140MZmlEslIcx.png https://ithelp.ithome.com.tw/upload/images/20190930/20120140qev91QDA48.png
今天實作03 https://ithelp.ithome.com.tw/upload/images/20190930/201201406CH7xtigif.png https://ithelp.ithome.com.tw/upload/images/20190930/201201401eBZrWePBG.png
  • 果然跟預想的一樣,還是賠錢的 嗚嗚... 但不可否認,這樣的訓練方式並不一定會使得模型更差,在某些環境下甚至可以預測出很漂亮的結果出來
    • https://ithelp.ithome.com.tw/upload/images/20190930/20120140T5A81wkF2J.png

上方的實作結果都是調整參數後的輸出,可以直接透過參數改變訓練出來action比例,也可以透過修改環境使得輸出更貼近極限。

在上面的實作03應該是我調出來的最好結果... 因為在沒有模型狀態的輸入之下,也會有賣出的動作

感想來說... 要調出好的參數真的要費一番功夫,設計Reward也是很難得的經驗,只差在還沒引入環境狀態,不然可能可以訓練得更好XD 最後為了要讓它「可以賣」我真的絞盡腦汁 (抱歉...我是菜雞XD 。 這篇是股票的實作系列最終章,明天附上大整理,包括我有做的和我還沒做卻想做的(嗚嗚 時間有限Orz ,感想什麼的,明天吧 !

程式碼

rl_02 :: train with reward


上一篇
偏門RL實測 :: 用超簡單股票交易模擬器來訓練模型
下一篇
預計撐兩天的我,今天是第30天 - 筆記總整理
系列文
AI可以分析股票嗎?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言